WebGL GPUã¡ã¢ãªã®æé©åã®ããã®é«åºŠãªææ³ããé局管çãšãã«ãã¬ãã«ã¡ã¢ãªæŠç¥ãéããŠæ¢æ±ããŸããããã¯ã髿§èœãªãŠã§ãã°ã©ãã£ãã¯ã¹ã«äžå¯æ¬ ã§ãã
WebGL GPUã¡ã¢ãªé局管çïŒãã«ãã¬ãã«ã¡ã¢ãªæé©å
髿§èœãªãŠã§ãã°ã©ãã£ãã¯ã¹ã®åéã§ã¯ãã°ã©ãã£ãã¯ã¹åŠçãŠãããïŒGPUïŒã¡ã¢ãªã®å¹ççãªå©çšãæãéèŠã§ãããŠã§ãã¢ããªã±ãŒã·ã§ã³ããç¹ã«3Dã¬ã³ããªã³ã°ãã²ãŒã ãããã³è€éãªããŒã¿èŠèŠåãªã©ã®åéã§ãèŠèŠçãªå¿ å®åºŠãšã€ã³ã¿ã©ã¯ãã£ãæ§ã®éçãæŒãåºããã«ã€ããŠãGPUã¡ã¢ãªãžã®èŠæ±ã¯åçã«ãšã¹ã«ã¬ãŒãããŸããWebGLã¯ããã©ã°ã€ã³ãªãã§äºææ§ã®ãããŠã§ããã©ãŠã¶å ã§ã€ã³ã¿ã©ã¯ãã£ããª2Dããã³3Dã°ã©ãã£ãã¯ã¹ãã¬ã³ããªã³ã°ããããã®JavaScript APIã§ããã匷åãªæ©èœãæäŸããŸãããã¡ã¢ãªç®¡çã«ãããŠé倧ãªèª²é¡ãæç€ºããŸãããã®æçš¿ã§ã¯ãããã¹ã ãŒãºã§ãããå¿çæ§ãé«ããèŠèŠçã«è±ããªãŠã§ãäœéšãã°ããŒãã«ã«å®çŸããããã«ãWebGL GPUã¡ã¢ãªé局管çã®é«åºŠãªæŠç¥ãæãäžãããã«ãã¬ãã«ã¡ã¢ãªæé©åã«çŠç¹ãåœãŠãŸãã
WebGLã«ãããGPUã¡ã¢ãªã®éèŠãªåœ¹å²
GPUã¯ããã®å€§èŠæš¡äžŠåã¢ãŒããã¯ãã£ã«ãããã°ã©ãã£ãã¯ã¹ã®ã¬ã³ããªã³ã°ã«åªããŠããŸãããã ããã¬ã³ããªã³ã°ã«å¿ èŠãªããŒã¿ãä¿åããããã«ãå°çšã¡ã¢ãªïŒå€ãã®å ŽåãVRAMïŒãããªã©ã³ãã ã¢ã¯ã»ã¹ã¡ã¢ãªïŒãšåŒã°ããïŒã«äŸåããŠããŸããããã«ã¯ããã¯ã¹ãã£ãé ç¹ãããã¡ãã€ã³ããã¯ã¹ãããã¡ãã·ã§ãŒããŒããã°ã©ã ãããã³ãã¬ãŒã ãããã¡ãªããžã§ã¯ããå«ãŸããŸããã·ã¹ãã RAMãšã¯ç°ãªããVRAMã¯éåžžãGPUã«å¿ èŠãªé«åž¯åå¹ ã䞊åã¢ã¯ã»ã¹ãã¿ãŒã³åãã«é«éåããã³æé©åãããŠããŸããGPUã¡ã¢ãªãããã«ããã¯ã«ãªããšãããã©ãŒãã³ã¹ãå€§å¹ ã«äœäžããŸããäžè¬çãªçç¶ã¯æ¬¡ã®ãšããã§ãã
- ã¹ã¿ãã¿ãªã³ã°ãšãã¬ãŒã ããããïŒ GPUã¯å¿ èŠãªããŒã¿ãžã®ã¢ã¯ã»ã¹ãŸãã¯ããŒãã«èŠåŽããäžè²«æ§ã®ãªããã¬ãŒã ã¬ãŒãã«ã€ãªãããŸãã
- ã¡ã¢ãªäžè¶³ãšã©ãŒïŒæ·±å»ãªå Žåãã¢ããªã±ãŒã·ã§ã³ã¯äœ¿çšå¯èœãªVRAMãè¶ ããå Žåã«ã¯ã©ãã·ã¥ãŸãã¯ããŒãã«å€±æããå¯èœæ§ããããŸãã
- èŠèŠå質ã®äœäžïŒéçºè ã¯ãã¡ã¢ãªã®å¶çŽå ã«åãŸãããã«ããã¯ã¹ãã£ã®è§£å床ãŸãã¯ã¢ãã«ã®è€éããæžããããšãäœåãªããããå ŽåããããŸãã
- ããŒãæéã®å»¶é·ïŒããŒã¿ã¯ã·ã¹ãã RAMãšVRAMã®éã§åžžã«ã¹ã¯ããããå¿ èŠããããããæåã®ããŒãæéãšåŸç¶ã®ã¢ã»ããããŒããå¢å ããŸãã
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«ãšã£ãŠããããã®åé¡ã¯å¢å¹ ãããŸããäžçäžã®ãŠãŒã¶ãŒã¯ããã€ãšã³ãã¯ãŒã¯ã¹ããŒã·ã§ã³ãããéãããVRAMãåããäœé»åã¢ãã€ã«ããã€ã¹ãŸã§ãå¹ åºãããã€ã¹ã§ãŠã§ãã³ã³ãã³ãã«ã¢ã¯ã»ã¹ããŸãããããã£ãŠã广çãªã¡ã¢ãªç®¡çã¯ãããŒã¯ããã©ãŒãã³ã¹ãéæããããšã ãã§ãªãã倿§ãªããŒããŠã§ã¢æ©èœå šäœã§ã¢ã¯ã»ã·ããªãã£ãšäžè²«æ§ã®ãããšã¯ã¹ããªãšã³ã¹ã確ä¿ããããšã§ããããŸãã
GPUã¡ã¢ãªéå±€ã®çè§£
GPUã¡ã¢ãªæé©åã®ã³ã³ããã¹ãã«ããããé局管çããšããçšèªã¯ãã¢ã¯ã»ã¹æ§ãšããã©ãŒãã³ã¹ã®ç°ãªãã¬ãã«ã«ããã£ãŠã¡ã¢ãªãªãœãŒã¹ãç·šæããã³å¶åŸ¡ããããšãæããŸããGPUèªäœã«ã¯ãã©ã€ããªVRAMããããŸãããWebGLã®å šäœçãªã¡ã¢ãªç°å¢ã«ã¯ããã®å°çšããŒã«ã ãã§ã¯ãããŸãããããã¯ä»¥äžãå«ã¿ãŸãïŒ
- GPU VRAMïŒ GPUãã¢ã¯ã»ã¹ã§ããæãé«éã§çŽæ¥çãªã¡ã¢ãªãããã¯æãéèŠãªãªãœãŒã¹ã§ãããæãéããããªãœãŒã¹ã§ããããŸãã
- ã·ã¹ãã RAMïŒãã¹ãã¡ã¢ãªïŒïŒã³ã³ãã¥ãŒã¿ã®ã¡ã€ã³ã¡ã¢ãªãGPUã䜿çšããã«ã¯ãããŒã¿ãã·ã¹ãã RAMããVRAMã«è»¢éããå¿ èŠããããŸãããã®è»¢éã«ã¯ãã¬ã€ãã³ã·ãšåž¯åå¹ ã®ã³ã¹ããããããŸãã
- CPUãã£ãã·ã¥/ã¬ãžã¹ã¿ïŒ CPUãçŽæ¥ã¢ã¯ã»ã¹ã§ããéåžžã«é«éã§å°ããªã¡ã¢ãªãçŽæ¥GPUã¡ã¢ãªã§ã¯ãããŸããããCPUã§ã®å¹ççãªããŒã¿æºåã¯ãGPUã¡ã¢ãªã®äœ¿çšéã鿥çã«æ¹åã§ããŸãã
ãã«ãã¬ãã«ã¡ã¢ãªæé©åæŠç¥ã¯ãããŒã¿è»¢éãšã¢ã¯ã»ã¹ã¬ã€ãã³ã·ã«é¢é£ããããã©ãŒãã³ã¹ããã«ãã£ãæå°éã«æããããã«ããããã®ã¬ãã«å šäœã§ããŒã¿ãæŠç¥çã«é 眮ããã³ç®¡çããããšãç®æããŠããŸããç®æšã¯ãé »ç¹ã«ã¢ã¯ã»ã¹ãããåªå 床ã®é«ãããŒã¿ãæéã®ã¡ã¢ãªïŒVRAMïŒã«ä¿æããªãããéèŠåºŠã®äœãããŒã¿ãŸãã¯ã¢ã¯ã»ã¹é »åºŠã®äœãããŒã¿ãäœéå±€ã§ã€ã³ããªãžã§ã³ãã«åŠçããããšã§ãã
WebGLã«ããããã«ãã¬ãã«ã¡ã¢ãªæé©åã®åºæ¬åå
WebGLã§ãã«ãã¬ãã«ã¡ã¢ãªæé©åãå®è£ ããã«ã¯ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãããŒã¿æ§é ãããã³ãªãœãŒã¹ã©ã€ããµã€ã¯ã«ãæ·±ãçè§£ããå¿ èŠããããŸããéèŠãªååã¯æ¬¡ã®ãšããã§ãã
1. ããŒã¿ã®åªå é äœä»ããšããã/ã³ãŒã«ãããŒã¿åæ
ãã¹ãŠã®ããŒã¿ãå¹³çã«äœæãããããã§ã¯ãããŸãããäžéšã®ã¢ã»ããã¯åžžã«äœ¿çšãããŸãïŒããšãã°ãã³ã¢ã·ã§ãŒããŒãé »ç¹ã«è¡šç€ºããããã¯ã¹ãã£ïŒãäžæ¹ããã®ä»ã¯æ£çºçã«äœ¿çšãããŸãïŒããšãã°ãããŒãç»é¢ãçŸåšè¡šç€ºãããŠããªããã£ã©ã¯ã¿ãŒã¢ãã«ïŒãããŒã¿ããããããïŒé »ç¹ã«ã¢ã¯ã»ã¹ãããïŒãšãã³ãŒã«ããïŒã¢ã¯ã»ã¹é »åºŠãäœãïŒã«èå¥ããã³åé¡ããããšãæåã®ã¹ãããã§ãã
- ãããããŒã¿ïŒçæ³çã«ã¯VRAMã«ååšããå¿ èŠããããŸãã
- ã³ãŒã«ãããŒã¿ïŒã·ã¹ãã RAMã«ä¿æããå¿ èŠãªå Žåã«ã®ã¿VRAMã«è»¢éã§ããŸããããã«ã¯ãå§çž®ãããã¢ã»ããã®è§£åããŸãã¯äœ¿çšãããŠããªãå Žåã®VRAMããã®å²ãåœãŠè§£é€ãå«ãŸããå ŽåããããŸãã
2. å¹ççãªããŒã¿æ§é ãšåœ¢åŒ
ããŒã¿ã®æ§é åããã³ãã©ãŒãããæ¹æ³ã¯ãã¡ã¢ãªãããããªã³ããšã¢ã¯ã»ã¹é床ã«çŽæ¥åœ±é¿ããŸããäŸãã°ïŒ
- ãã¯ã¹ãã£å§çž®ïŒ GPUãã€ãã£ãã®ãã¯ã¹ãã£å§çž®åœ¢åŒïŒãã©ãŠã¶/GPUã®ãµããŒãã«å¿ããŠãASTCãETC2ãS3TC/DXTãªã©ïŒã䜿çšãããšãèŠèŠå質ã®äœäžãæå°éã«æããªãããVRAMã®äœ¿çšéãå€§å¹ ã«åæžã§ããŸãã
- é ç¹ããŒã¿æé©åïŒé ç¹å±æ§ïŒäœçœ®ãæ³ç·ãUVãè²ïŒãæå°éã®å¹æçãªããŒã¿åïŒããšãã°ãå¯èœãªå Žåã¯UVã«`Uint16Array`ãäœçœ®ã«`Float32Array`ïŒã«ããã¯ããããããå¹ççã«ã€ã³ã¿ãŒãªãŒããããšããããã¡ãµã€ãºãåæžããããã£ãã·ã¥ã³ããŒã¬ã³ã·ãåäžããŸãã
- ããŒã¿ã¬ã€ã¢ãŠãïŒ GPUãã¬ã³ããªãŒãªã¬ã€ã¢ãŠãïŒããšãã°ãæ§é äœé å-AOSãšé åæ§é äœ-SOAïŒã§ããŒã¿ãæ ŒçŽãããšãã¢ã¯ã»ã¹ãã¿ãŒã³ã«å¿ããŠããã©ãŒãã³ã¹ãåäžããå ŽåããããŸãã
3. ãªãœãŒã¹ããŒãªã³ã°ãšåå©çš
GPUãªãœãŒã¹ïŒãã¯ã¹ãã£ããããã¡ããã¬ãŒã ãããã¡ïŒã®äœæãšç Žæ£ã¯ãCPUãªãŒããŒããããšæœåšçãªã¡ã¢ãªãã©ã°ã¡ã³ããŒã·ã§ã³ã®äž¡æ¹ã®ç¹ã§ãã³ã¹ãã®ãããæäœã«ãªãå¯èœæ§ããããŸããããŒãªã³ã°ã¡ã«ããºã ãå®è£ ãããšã次ã®ããšãå¯èœã«ãªããŸãã
- ãã¯ã¹ãã£ã¢ãã©ã¹ïŒè€æ°ã®å°ããªãã¯ã¹ãã£ã1ã€ã®å€§ããªãã¯ã¹ãã£ã«çµåãããšããã¯ã¹ãã£ãã€ã³ãã®æ°ãæžããããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸãããŸããVRAMã®äœ¿çšéãçµ±åãããŸãã
- ãããã¡ã®åå©çšïŒåæ§ã®ããŒã¿ã«åå©çšã§ããäºåå²ãåœãŠæžã¿ãããã¡ã®ããŒã«ãç¶æãããšãç¹°ãè¿ãå²ãåœãŠ/å²ãåœãŠè§£é€ãµã€ã¯ã«ãåé¿ã§ããŸãã
- ãã¬ãŒã ãããã¡ã®ãã£ãã·ã¥ïŒãã¯ã¹ãã£ãžã®ã¬ã³ããªã³ã°ã«ãã¬ãŒã ãããã¡ãªããžã§ã¯ããåå©çšãããšãã¡ã¢ãªãç¯çŽãããªãŒããŒããããåæžã§ããŸãã
4. ã¹ããªãŒãã³ã°ãšéåæããŒã
ã¡ã€ã³ã¹ã¬ããã®ããªãŒãºãã¢ã»ããããŒãäžã®å€§å¹ ãªã¹ã¿ãã¿ãªã³ã°ãåé¿ããããã«ãããŒã¿ã¯éåæã§ã¹ããªãŒãã³ã°ããå¿ èŠããããŸããããã«ã¯å€ãã®å Žåãæ¬¡ã®ããšãå«ãŸããŸãã
- ãã£ã³ã¯ã§ã®ããŒãïŒå€§ããªã¢ã»ããããé çªã«ããŒãããã³åŠçã§ããå°ããªããŒã¹ã«åå²ããŸãã
- ããã°ã¬ãã·ãããŒãã£ã³ã°ïŒæåã«ã¢ã»ããã®äœè§£å床ããŒãžã§ã³ãããŒãããæ¬¡ã«äœ¿çšå¯èœã«ãªããã¡ã¢ãªå ã«åãŸãã«ã€ããŠãããé«è§£å床ããŒãžã§ã³ãããã°ã¬ãã·ãã«ããŒãããŸãã
- ããã¯ã°ã©ãŠã³ãã¹ã¬ããïŒ Webã¯ãŒã«ãŒãå©çšããŠãã¡ã€ã³ã¹ã¬ããããé¢ããŠããŒã¿ã®è§£åã圢åŒå€æãããã³åæããŒããåŠçããŸãã
5. ã¡ã¢ãªã®äºç®ç·šæãšã«ãªã³ã°
ããŸããŸãªã¿ã€ãã®ã¢ã»ããã«å¯ŸããŠæç¢ºãªã¡ã¢ãªäºç®ã確ç«ããäžèŠã«ãªã£ããªãœãŒã¹ãç©æ¥µçã«ã«ãªã³ã°ããããšã¯ãã¡ã¢ãªã®æ¯æžãé²ãããã«éèŠã§ãã
- å¯èŠæ§ã«ãªã³ã°ïŒã«ã¡ã©ã«è¡šç€ºãããªããªããžã§ã¯ããã¬ã³ããªã³ã°ããŸãããããã¯æšæºçãªæ¹æ³ã§ãããé¢é£ããGPUãªãœãŒã¹ïŒãã¯ã¹ãã£ãé ç¹ããŒã¿ãªã©ïŒã¯ãã¡ã¢ãªãäžè¶³ããŠããå Žåãã¢ã³ããŒãã®åè£ã«ãªãå¯èœæ§ãããããšãæå³ããŸãã
- 詳现ã¬ãã«ïŒLODïŒïŒé ãã«ãããªããžã§ã¯ãã«ã¯ãããåçŽãªã¢ãã«ãšäœè§£å床ã®ãã¯ã¹ãã£ã䜿çšããŸããããã«ãããã¡ã¢ãªèŠä»¶ãçŽæ¥åæžãããŸãã
- æªäœ¿çšã®ã¢ã»ããã®ã¢ã³ããŒãïŒãã°ããã¢ã¯ã»ã¹ãããŠããªãVRAMããã¢ã»ãããã¢ã³ããŒãããŠãæ°ããã¢ã»ããã®ã¹ããŒã¹ãè§£æŸããããã«ããšãã¯ã·ã§ã³ããªã·ãŒïŒããšãã°ãLeast Recently Used-LRUïŒãå®è£ ããŸãã
é«åºŠãªéå±€ã¡ã¢ãªç®¡çææ³
åºæ¬çãªååãè¶ ããŠãé«åºŠãªé局管çã«ã¯ãã¡ã¢ãªã©ã€ããµã€ã¯ã«ãšé 眮ãããè€éã«å¶åŸ¡ããããšãå«ãŸããŸãã
1. ã¹ããŒãžã³ã°ãããã¡ã¢ãªè»¢é
ã·ã¹ãã RAMããVRAMãžã®è»¢éã¯ããã«ããã¯ã«ãªãå¯èœæ§ããããŸããéåžžã«å€§ããªããŒã¿ã»ããã®å Žåãã¹ããŒãžã³ã°ãããã¢ãããŒããæçãªå ŽåããããŸãã
- CPUåŽã®ã¹ããŒãžã³ã°ãããã¡ïŒã¢ããããŒãã®ããã«`WebGLBuffer`ã«çŽæ¥æžã蟌ã代ããã«ãããŒã¿ãæåã«ã·ã¹ãã RAMã®ã¹ããŒãžã³ã°ãããã¡ã«é 眮ã§ããŸãããã®ãããã¡ã¯ãCPUã®æžã蟌ã¿çšã«æé©åã§ããŸãã
- GPUåŽã®ã¹ããŒãžã³ã°ãããã¡ïŒææ°ã®GPUã¢ãŒããã¯ãã£ã®äžã«ã¯ãVRAMèªäœã®äžã«æç€ºçãªã¹ããŒãžã³ã°ãããã¡ããµããŒãããŠãããã®ããããæçµçãªé 眮ã®åã«äžéããŒã¿æäœãå¯èœã§ããWebGLã§ã¯ãããçŽæ¥å¶åŸ¡ããããšã¯éãããŠããŸãããéçºè ã¯ãïŒWebGPUãŸãã¯æ¡åŒµæ©èœã䜿çšããïŒã³ã³ãã¥ãŒãã·ã§ãŒããŒãå©çšããŠãããé«åºŠãªã¹ããŒãžã³ã°æäœãè¡ãããšãã§ããŸãã
ããã§ã®éµã¯ããªãŒããŒããããæå°éã«æããããã«è»¢éããããåŠçããããšã§ããå°ããªããŒã¿ãé »ç¹ã«ã¢ããããŒããã代ããã«ãã·ã¹ãã RAMã«ããŒã¿ãèç©ãã倧ããªãã£ã³ã¯ãã¢ããããŒãããé »åºŠãæžãããŸãã
2. åçãªãœãŒã¹ã®ã¡ã¢ãªããŒã«
ããŒãã£ã¯ã«ãäžæçãªã¬ã³ããªã³ã°ã¿ãŒã²ããããã¬ãŒã ããšã®ããŒã¿ãªã©ãåçãªãœãŒã¹ã¯ãå€ãã®å Žåã寿åœãçãã§ããããããå¹ççã«ç®¡çããã«ã¯ãå°çšã®ã¡ã¢ãªããŒã«ãå¿ èŠã§ãã
- åçãããã¡ããŒã«ïŒ VRAMã«å€§ããªãããã¡ãäºåå²ãåœãŠããŸããåçãªãœãŒã¹ã«ã¡ã¢ãªãå¿ èŠãªå Žåã¯ãããŒã«ããã»ã¯ã·ã§ã³ãåãåºããŸãããªãœãŒã¹ãäžèŠã«ãªã£ãããã»ã¯ã·ã§ã³ãè§£æŸæžã¿ãšããŠããŒã¯ããŸããããã«ããã`DYNAMIC_DRAW`ã䜿çšãã`gl.bufferData`åŒã³åºãã®ãªãŒããŒããããåé¿ãããŸããããã¯ã³ã¹ãããããå¯èœæ§ããããŸãã
- äžæãã¯ã¹ãã£ããŒã«ïŒãããã¡ãšåæ§ã«ãäžæãã¯ã¹ãã£ã®ããŒã«ãäžéã¬ã³ããªã³ã°ãã¹ã§ç®¡çã§ããŸãã
倿°ã®å°ããªãªããžã§ã¯ããå¹ççã«ã¬ã³ããªã³ã°ããã«ã¯ã`WEBGL_multi_draw`ã®ãããªæ¡åŒµæ©èœã®äœ¿çšãæ€èšããŠãã ãããããã«ãããæç»åŒã³åºãã®ãªãŒããŒããããåæžãããããå€ãã®ã¡ã¢ãªãã¢ã»ããã«å²ãåœãŠãããšãã§ããŸãã
3. ãã¯ã¹ãã£ã¹ããªãŒãã³ã°ãšããããããã³ã°ã¬ãã«
ããããããã¯ããªããžã§ã¯ããé ããã衚瀺ããããšãã«èŠèŠçãªå質ãšããã©ãŒãã³ã¹ãåäžãããããã«äœ¿çšããããäºåã«èšç®ãããçž®å°ããŒãžã§ã³ã®ãã¯ã¹ãã£ã§ããã€ã³ããªãžã§ã³ããªãããããã管çã¯ãéå±€çãªãã¯ã¹ãã£æé©åã®åºç€ã§ãã
- èªåããããããçæïŒ `gl.generateMipmap()`ã¯äžå¯æ¬ ã§ãã
- ç¹å®ã®ãããã¬ãã«ã®ã¹ããªãŒãã³ã°ïŒéåžžã«å€§ããªãã¯ã¹ãã£ã®å Žåãé«è§£å床ã®ãããã¬ãã«ã®ã¿ãVRAMã«ããŒãããå¿ èŠã«å¿ããŠäœè§£å床ã®ãã®ãã¹ããªãŒãã³ã°ããæ¹ãæçãªå ŽåããããŸããããã¯ãå€ãã®å Žåãå°çšã®ã¢ã»ããã¹ããªãŒãã³ã°ã·ã¹ãã ã«ãã£ãŠç®¡çãããè€éãªææ³ã§ãããå®å šã«å¶åŸ¡ããã«ã¯ãã«ã¹ã¿ã ã·ã§ãŒããŒããžãã¯ãŸãã¯æ¡åŒµæ©èœãå¿ èŠã«ãªãå ŽåããããŸãã
- ç°æ¹æ§ãã£ã«ã¿ãªã³ã°ïŒäž»ã«èŠèŠçãªå質èšå®ã§ãããé©åã«ç®¡çããããããããããã§ãŒã³ããã¡ãªãããåŸãããŸããç°æ¹æ§ãã£ã«ã¿ãªã³ã°ãæå¹ã«ãªã£ãŠããå Žåã¯ããããããããå®å šã«ç¡å¹ã«ããªãããã«ããŠãã ããã
4. äœ¿çšæ³ãã³ãã䜿çšãããããã¡ç®¡ç
WebGLãããã¡ïŒ`gl.createBuffer()`ïŒãäœæãããšãã¯ãäœ¿çšæ³ãã³ãïŒããšãã°ã`STATIC_DRAW`ã`DYNAMIC_DRAW`ã`STREAM_DRAW`ïŒãæäŸããŸãããããã®ãã³ããçè§£ããããšã¯ããã©ãŠã¶ãšGPUãã©ã€ããŒãã¡ã¢ãªå²ãåœãŠãšã¢ã¯ã»ã¹ãã¿ãŒã³ãæé©åããããã«éèŠã§ãã
- `STATIC_DRAW`ïŒããŒã¿ã¯äžåºŠã¢ããããŒããããäœåºŠãèªã¿åãããŸãã倿Žãããªããžãªã¡ããªãšãã¯ã¹ãã£ã«æé©ã§ãã
- `DYNAMIC_DRAW`ïŒããŒã¿ã¯é »ç¹ã«å€æŽãããäœåºŠãæç»ãããŸããããã¯å€ãã®å ŽåãããŒã¿ãVRAMã«ååšããããšãæå³ããŸãããCPUããæŽæ°ã§ããŸãã
- `STREAM_DRAW`ïŒããŒã¿ã¯äžåºŠèšå®ãããæ°åãã䜿çšãããŸãããããã¯ãäžæçãªããŒã¿ããŸãã¯åäžã®ãã¬ãŒã ã§äœ¿çšãããããŒã¿ã瀺åããŠããå¯èœæ§ããããŸãã
ãã©ã€ããŒã¯ãããã®ãã³ãã䜿çšããŠããããã¡å šäœãVRAMã«é 眮ããããã·ã¹ãã RAMã«ã³ããŒãä¿æããããå°çšã®æžã蟌ã¿çµåã¡ã¢ãªé åã䜿çšããããæ±ºå®ããå ŽåããããŸãã
5. ãã¬ãŒã ãããã¡ãªããžã§ã¯ãïŒFBOïŒãšã¬ã³ããŒã»ããŒã»ãã¯ã¹ãã£æŠç¥
FBOã䜿çšãããšãããã©ã«ãã®ãã£ã³ãã¹ã§ã¯ãªãããã¯ã¹ãã£ã«ã¬ã³ããªã³ã°ã§ããŸããããã¯ãå€ãã®é«åºŠãªãšãã§ã¯ãïŒãã¹ãããã»ãã·ã³ã°ãã·ã£ããŠãåå°ïŒã®åºæ¬ã§ããã倧éã®VRAMãæ¶è²»ããå¯èœæ§ããããŸãã
- FBOãšãã¯ã¹ãã£ã®åå©çšïŒããŒãªã³ã°ã§è¿°ã¹ãããã«ãFBOãšãã®é¢é£ããã¬ã³ããŒã¿ãŒã²ãããã¯ã¹ãã£ãäžå¿ èŠã«äœæããã³ç Žæ£ããªãã§ãã ããã
- é©åãªãã¯ã¹ãã£åœ¢åŒïŒã¬ã³ããŒã¿ãŒã²ããã«ã¯ãæãå°ããé©åãªãã¯ã¹ãã£åœ¢åŒã䜿çšããŸãïŒããšãã°ã粟床ãèš±ãå Žåã¯ã`RGBA8`ã®ä»£ããã«`RGBA4`ãŸãã¯`RGB5_A1`ïŒã
- 深床/ã¹ãã³ã·ã«ç²ŸåºŠïŒæ·±åºŠãããã¡ãå¿ èŠãªå Žåã¯ã`DEPTH_COMPONENT32F`ã®ä»£ããã«`DEPTH_COMPONENT16`ã§ååãã©ãããæ€èšããŠãã ããã
å®è·µçãªå®è£ æŠç¥ãšäŸ
ãããã®ææ³ãå®è£ ããã«ã¯ãå€ãã®å Žåãå ç¢ãªã¢ã»ãã管çã·ã¹ãã ãå¿ èŠã§ããããã€ãã®ã·ããªãªãæ€èšããŸãããã
ã·ããªãª1ïŒã°ããŒãã«Eã³ããŒã¹3D補åãã¥ãŒã¢
課é¡ïŒè©³çްãªãã¯ã¹ãã£ãå«ã補åã®é«è§£å床3Dã¢ãã«ã衚瀺ããŸããäžçäžã®ãŠãŒã¶ãŒãããŸããŸãªããã€ã¹ã§ããã«ã¢ã¯ã»ã¹ããŸãã
æé©åæŠç¥ïŒ
- 詳现ã¬ãã«ïŒLODïŒïŒããã©ã«ãã§ã¯ãã¢ãã«ã®ããŒããªããŒãžã§ã³ãšäœè§£å床ãã¯ã¹ãã£ãããŒãããŸãããŠãŒã¶ãŒããºãŒã ã€ã³ãŸãã¯æäœãããšãããé«è§£å床ã®LODãšãã¯ã¹ãã£ãã¹ããªãŒãã³ã°ããŸãã
- ãã¯ã¹ãã£å§çž®ïŒãã¹ãŠã®ãã¯ã¹ãã£ã«ASTCãŸãã¯ETC2ã䜿çšããããŸããŸãªã¿ãŒã²ããããã€ã¹ãŸãã¯ãããã¯ãŒã¯æ¡ä»¶ã«åãããŠç°ãªãå質ã¬ãã«ãæäŸããŸãã
- ã¡ã¢ãªäºç®ïŒè£œåãã¥ãŒã¢ã«å³æ ŒãªVRAMäºç®ãèšå®ããŸããäºç®ãè¶ ããå Žåã¯ãLODãŸãã¯ãã¯ã¹ãã£ã®è§£å床ãèªåçã«ããŠã³ã°ã¬ãŒãããŸãã
- éåæããŒãïŒãã¹ãŠã®ã¢ã»ãããéåæã§ããŒãããé²è¡ç¶æ³ã€ã³ãžã±ãŒã¿ãŒã衚瀺ããŸãã
äŸïŒãœãã¡ã玹ä»ããå®¶å ·äŒç€Ÿãã¢ãã€ã«ããã€ã¹ã§ã¯ã512x512ã®å§çž®ãã¯ã¹ãã£ã䜿çšããããŒããªã¢ãã«ãããŒããããŸãããã¹ã¯ãããã§ã¯ããŠãŒã¶ãŒããºãŒã ãããšã2048x2048ã®å§çž®ãã¯ã¹ãã£ã䜿çšãããã€ããªã¢ãã«ãã¹ããªãŒãã³ã°ãããŸããããã«ãããã©ãã§ã劥åœãªããã©ãŒãã³ã¹ã確ä¿ãããäœè£ã®ãã人ã«ãã¬ãã¢ã ããžã¥ã¢ã«ãæäŸããŸãã
ã·ããªãª2ïŒãŠã§ãäžã®ãªã¢ã«ã¿ã€ã æŠç¥ã²ãŒã
課é¡ïŒå€æ°ã®ãŠããããè€éãªç°å¢ãããã³ãšãã§ã¯ããåæã«ã¬ã³ããªã³ã°ããŸããããã©ãŒãã³ã¹ã¯ã²ãŒã ãã¬ã€ã«ãšã£ãŠéåžžã«éèŠã§ãã
æé©åæŠç¥ïŒ
- ã€ã³ã¹ã¿ã³ã¹åïŒ `gl.drawElementsInstanced`ãŸãã¯`gl.drawArraysInstanced`ã䜿çšããŠã1ã€ã®æç»åŒã³åºãããç°ãªã倿ãæã€å€æ°ã®åäžã¡ãã·ã¥ïŒæšããŠããããªã©ïŒãã¬ã³ããªã³ã°ããŸããããã«ãããé ç¹ããŒã¿ã«å¿ èŠãªVRAMãå€§å¹ ã«åæžãããæç»åŒã³åºãã®å¹çãåäžããŸãã
- ãã¯ã¹ãã£ã¢ãã©ã¹ïŒé¡äŒŒãããªããžã§ã¯ãïŒããšãã°ããã¹ãŠã®ãŠããããã¯ã¹ãã£ããã¹ãŠã®å»ºç©ãã¯ã¹ãã£ïŒã®ãã¯ã¹ãã£ã倧ããªã¢ãã©ã¹ã«çµåããŸãã
- åçãããã¡ããŒã«ïŒæ°ãããããã¡ããã¬ãŒã ããšã«å²ãåœãŠãã®ã§ã¯ãªããåçããŒã«ã§ãã¬ãŒã ããšã®ããŒã¿ïŒã€ã³ã¹ã¿ã³ã¹åãããã¡ãã·ã¥ã®å€æãªã©ïŒã管çããŸãã
- ã·ã§ãŒããŒã®æé©åïŒã·ã§ãŒããŒããã°ã©ã ãã³ã³ãã¯ãã«ä¿ã¡ãŸããæªäœ¿çšã®ã·ã§ãŒããŒããªãšãŒã·ã§ã³ã¯ãã³ã³ãã€ã«ããã圢åŒã§VRAMã«ååšããªãããã«ããå¿ èŠããããŸãã
- ã°ããŒãã«ã¢ã»ãã管çïŒãã¯ã¹ãã£ãšãããã¡ã®LRUãã£ãã·ã¥ãå®è£ ããŸããVRAMã容éã«è¿ã¥ããããæè¿äœ¿çšãããŠããªãã¢ã»ãããã¢ã³ããŒãããŸãã
äŸïŒç»é¢äžã«æ°çŸäººã®å µå£«ãããã²ãŒã ã§ã¯ãããããã«åå¥ã®é ç¹ãããã¡ãšãã¯ã¹ãã£ãçšæãã代ããã«ã1ã€ã®å€§ããªãããã¡ãšãã¯ã¹ãã£ã¢ãã©ã¹ããã€ã³ã¹ã¿ã³ã¹åããŸããããã«ãããVRAMãããããªã³ããšæç»åŒã³åºãã®ãªãŒããŒããããå€§å¹ ã«åæžãããŸãã
ã·ããªãª3ïŒå€§èŠæš¡ãªããŒã¿ã»ããã䜿çšããããŒã¿èŠèŠå
課é¡ïŒæ°çŸäžã®ããŒã¿ãã€ã³ããèŠèŠåããŸããæœåšçã«è€éãªãžãªã¡ããªãšåçãªæŽæ°ãå«ãŸããŸãã
æé©åæŠç¥ïŒ
- GPUã³ã³ãã¥ãŒãã£ã³ã°ïŒå©çšå¯èœãªå Žå/å¿ èŠãªå ŽåïŒïŒè€éãªèšç®ãå¿ èŠãšããéåžžã«å€§ããªããŒã¿ã»ããã®å Žåã¯ãWebGPUãŸãã¯WebGLã³ã³ãã¥ãŒãã·ã§ãŒããŒæ¡åŒµæ©èœã䜿çšããŠGPUã§çŽæ¥èšç®ãå®è¡ããCPUãžã®ããŒã¿è»¢éãåæžããããšãæ€èšããŠãã ããã
- VAOãšãããã¡ç®¡çïŒ Vertex Array ObjectsïŒVAOïŒã䜿çšããŠãé ç¹ãããã¡æ§æãã°ã«ãŒãåããŸããããŒã¿ãé »ç¹ã«æŽæ°ãããå Žåã¯ã`DYNAMIC_DRAW`ã䜿çšããŸãããæŽæ°ãµã€ãºãæå°éã«æããããã«ãããŒã¿ãå¹ççã«ã€ã³ã¿ãŒãªãŒãããããšãæ€èšããŠãã ããã
- ããŒã¿ã¹ããªãŒãã³ã°ïŒçŸåšã®ãã¥ãŒããŒãã«è¡šç€ºãããŠããããŒã¿ããŸãã¯çŸåšã®ã€ã³ã¿ã©ã¯ã·ã§ã³ã«é¢é£ããããŒã¿ã®ã¿ãããŒãããŸãã
- ãã€ã³ãã¹ãã©ã€ã/ããŒããªã¡ãã·ã¥ïŒè€éãªã¡ãã·ã¥ã§ã¯ãªããåçŽãªãžãªã¡ããªïŒãã€ã³ãããã«ããŒããªã©ïŒã§é«å¯åºŠã®ããŒã¿ãã€ã³ãã衚ããŸãã
äŸïŒã°ããŒãã«ãªæ°è±¡ãã¿ãŒã³ã®èŠèŠåãé¢šã®æµãã®ããã«æ°çŸäžã®åã ã®ããŒãã£ã¯ã«ãã¬ã³ããªã³ã°ãã代ããã«ãããŒãã£ã¯ã«ãGPUã§æŽæ°ãããããŒãã£ã¯ã«ã·ã¹ãã ã䜿çšããŸããããŒãã£ã¯ã«èªäœã®ã¬ã³ããªã³ã°ã«å¿ èŠãªé ç¹ãããã¡ããŒã¿ïŒäœçœ®ãè²ïŒã®ã¿ãVRAMã«å¿ èŠã§ãã
ã¡ã¢ãªæé©åã®ããã®ããŒã«ãšãããã°
广çãªã¡ã¢ãªç®¡çã¯ãé©åãªããŒã«ãšãããã°ææ³ãªãã«ã¯äžå¯èœã§ãã
- ãã©ãŠã¶éçºè ããŒã«ïŒ
- ChromeïŒ [ããã©ãŒãã³ã¹]ã¿ãã§ã¯ãGPUã¡ã¢ãªäœ¿çšéã®ãããã¡ã€ãªã³ã°ãå¯èœã§ãã[ã¡ã¢ãª]ã¿ãã§ã¯ãããŒãã¹ãããã·ã§ããããã£ããã£ã§ããŸãããVRAMã®çŽæ¥æ€æ»ã¯å¶éãããŠããŸãã
- FirefoxïŒ [ããã©ãŒãã³ã¹]ã¢ãã¿ãŒã«ã¯ãGPUã¡ã¢ãªã¡ããªãã¯ãå«ãŸããŠããŸãã
- ã«ã¹ã¿ã ã¡ã¢ãªã«ãŠã³ã¿ãŒïŒç¬èªã®JavaScriptã«ãŠã³ã¿ãŒãå®è£ ããŠãäœæãããã¯ã¹ãã£ããããã¡ãããã³ãã®ä»ã®GPUãªãœãŒã¹ã®ãµã€ãºã远跡ããŸããã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªãããããªã³ããçè§£ããããã«ããããã宿çã«ãã°ã«èšé²ããŸãã
- ã¡ã¢ãªãããã¡ã€ã©ãŒïŒããŒããããŠãããªãœãŒã¹ã®ãµã€ãºãšã¿ã€ããå ±åããããã«ãã¢ã»ããããŒããã€ãã©ã€ã³ã«ããã¯ããã©ã€ãã©ãªãŸãã¯ã«ã¹ã¿ã ã¹ã¯ãªããã
- WebGLã€ã³ã¹ãã¯ã¿ãŒããŒã«ïŒïŒäž»ã«ãã€ãã£ãéçºçšã§ããïŒRenderDocãPIXãªã©ã®ããŒã«ã¯ããã©ãŠã¶æ¡åŒµæ©èœãç¹å®ã®ã»ããã¢ãããšçµã¿åãããŠäœ¿çšââããŠãWebGLåŒã³åºããšãªãœãŒã¹ã®äœ¿çšç¶æ³ãåæã§ããå ŽåããããŸãã
ããŒãšãªããããã°ã®è³ªåïŒ
- VRAMã®åèšäœ¿çšéã¯ã©ããããã§ããïŒ
- ã©ã®ãªãœãŒã¹ãæãå€ãã®VRAMãæ¶è²»ããŠããŸããïŒ
- äžèŠã«ãªã£ããšãã«ãªãœãŒã¹ã¯è§£æŸãããŠããŸããïŒ
- éå°ãªã¡ã¢ãªã®å²ãåœãŠ/å²ãåœãŠè§£é€ãé »ç¹ã«çºçããŠããŸããïŒ
- ãã¯ã¹ãã£å§çž®ãVRAMãšèŠèŠå質ã«äžãã圱é¿ã¯äœã§ããïŒ
WebGLãšGPUã¡ã¢ãªç®¡çã®å°æ¥
WebGLã¯ç§ãã¡ã«åœ¹ç«ã£ãŠããŸãããããŠã§ãã°ã©ãã£ãã¯ã¹ã®ç¶æ³ã¯é²åããŠããŸããWebGLã®åŸç¶ã§ããWebGPUã¯ãããææ°ã®APIãæäŸããGPUããŒããŠã§ã¢ãžã®ããäœãã¬ãã«ã®ã¢ã¯ã»ã¹ãšãããçµ±äžãããã¡ã¢ãªã¢ãã«ãæäŸããŸããWebGPUã䜿çšãããšãéçºè ã¯ã¡ã¢ãªå²ãåœãŠããããã¡ç®¡çãããã³åæããã现ããå¶åŸ¡ã§ããããã«ãªããããã«é«åºŠãªéå±€åã¡ã¢ãªæé©åææ³ãå¯èœã«ãªãå¯èœæ§ããããŸãããã ããWebGLã¯åœé¢ã®éé¢é£æ§ãç¶æãããã®ã¡ã¢ãªç®¡çãç¿åŸããããšã¯äŸç¶ãšããŠéèŠãªã¹ãã«ã§ãã
çµè«ïŒããã©ãŒãã³ã¹ã®ããã®ã°ããŒãã«ãªå¿ é äºé
WebGL GPUã¡ã¢ãªé局管çãšãã«ãã¬ãã«ã¡ã¢ãªæé©åã¯ãåãªãæè¡çãªè©³çްã§ã¯ãããŸããããããã¯ãã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«é«å質ã§ãã¢ã¯ã»ã¹å¯èœã§ãããã©ãŒãã³ã¹ã®é«ããŠã§ããšã¯ã¹ããªãšã³ã¹ãæäŸããããã®åºæ¬ã§ããGPUã¡ã¢ãªã®ãã¥ã¢ã³ã¹ãçè§£ããããŒã¿ã®åªå é äœä»ããå¹ççãªæ§é ã®æ¡çšãã¹ããªãŒãã³ã°ãããŒãªã³ã°ãªã©ã®é«åºŠãªææ³ã®æŽ»çšã«ãããéçºè ã¯äžè¬çãªããã©ãŒãã³ã¹ã®ããã«ããã¯ãå æã§ããŸãã倿§ãªããŒããŠã§ã¢æ©èœãšãããã¯ãŒã¯ç¶æ ã«äžçäžã§é©å¿ã§ããèœåã¯ããããã®æé©åæŠç¥ã«ããã£ãŠããŸãããŠã§ãã°ã©ãã£ãã¯ã¹ãé²åãç¶ããã«ã€ããŠããããã®ã¡ã¢ãªç®¡çååãç¿åŸããããšã¯ãçã«é åçã§ãŠããã¿ã¹ãªãŠã§ãã¢ããªã±ãŒã·ã§ã³ãäœæããããã®éèŠãªå·®å¥åèŠå ã§ããç¶ããŸãã
å®çšçãªæŽå¯ïŒ
- ãã©ãŠã¶ã®éçºè ããŒã«ã䜿çšããŠçŸåšã®VRAM䜿çšéãç£æ»ããŸããæå€§ã®æ¶è²»è ãç¹å®ããŸãã
- ãã¹ãŠã®é©åãªã¢ã»ããã«ãã¯ã¹ãã£å§çž®ãå®è£ ããŸãã
- ã¢ã»ããã®ããŒããšã¢ã³ããŒãã®æŠç¥ãèŠçŽããŠãã ããããªãœãŒã¹ã¯ã©ã€ããµã€ã¯ã«å šäœãéããŠå¹æçã«ç®¡çãããŠããŸããïŒ
- ã¡ã¢ãªãã¬ãã·ã£ãŒã軜æžããããã«ãè€éãªã·ãŒã³ã®LODãšã«ãªã³ã°ãæ€èšããŠãã ããã
- é »ç¹ã«äœæ/ç Žæ£ãããåçãªããžã§ã¯ãã®ãªãœãŒã¹ããŒãªã³ã°ã調æ»ããŸãã
- WebGPUã®ææ°æ å ±ãå ¥æããŠãã ãããWebGPUã¯ãã¡ã¢ãªå¶åŸ¡ã®ããã®æ°ããææ®µãæäŸããŸãã
GPUã¡ã¢ãªã«ç©æ¥µçã«å¯ŸåŠããããšã§ãããã€ã¹ãå Žæã«é¢ä¿ãªããWebGLã¢ããªã±ãŒã·ã§ã³ãèŠèŠçã«å°è±¡çãªã ãã§ãªããäžçäžã®ãŠãŒã¶ãŒã«ãšã£ãŠå ç¢ã§ããã©ãŒãã³ã¹ã®é«ããã®ã«ãªãããã«ããããšãã§ããŸãã